Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Node / ReticulumProjects / MeshChatX.git / files / meshchatx / src / backend / interfaces / WebsocketClientInterface.py

Displaying Raw • Download


meshchatx/src/backend/interfaces/WebsocketClientInterface.py 4bd787ccd70a459a02eececca3f942f0e64ec4ce (4bd787cc) Text, 4.39 KB

T8b949e# SPDX-License-Identifier: 0BSD AND MIT

Tff7b72import T7ee787threading
Tff7b72import T7ee787time

Tff7b72import T7ee787RNS
Tff7b72from T7ee787RNST7ee787.T7ee787InterfacesT7ee787.T7ee787Interface Tff7b72import Te6edf3Interface
Tff7b72from T7ee787websocketsT7ee787.T7ee787syncT7ee787.T7ee787client Tff7b72import Te6edf3connect
Tff7b72from T7ee787websocketsT7ee787.T7ee787syncT7ee787.T7ee787connection Tff7b72import Te6edf3Connection


Tff7b72class T56d364WebsocketClientInterfaceTb4b4b4(Te6edf3InterfaceTb4b4b4)Tb4b4b4:
Te6edf3DEFAULT_IFAC_SIZE Tff7b72= T79c0ff16

Te6edf3RECONNECT_DELAY_SECONDS Tff7b72= T79c0ff5

Tff7b72def Tff7b72__str__Tb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72return Ta5d6fffTa5d6ff"Ta5d6ffWebsocketClientInterface[Tffd700{Tff7b72selfTff7b72.Td2a8ffnameTffd700}Ta5d6ff/Tffd700{Tff7b72selfTff7b72.Td2a8fftarget_urlTffd700}Ta5d6ff]Ta5d6ff"

Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3ownerTb4b4b4, Te6edf3configurationTb4b4b4, Te6edf3websocketTb4b4b4: Te6edf3Connection Tff7b72| Tff7b72None Tff7b72= Tff7b72NoneTb4b4b4)Tb4b4b4:
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff__init__Tb4b4b4(Tb4b4b4)

Tff7b72selfTff7b72.Td2a8ffowner Tff7b72= Te6edf3owner
Tff7b72selfTff7b72.Td2a8ffparent_interface Tff7b72= Tff7b72None

Tff7b72selfTff7b72.Td2a8ffIN Tff7b72= Tff7b72True
Tff7b72selfTff7b72.Td2a8ffOUT Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffHW_MTU Tff7b72= T79c0ff262144 T8b949e# 256KiB
Tff7b72selfTff7b72.Td2a8ffbitrate Tff7b72= T79c0ff1_000_000_000 T8b949e# 1Gbps
Tff7b72selfTff7b72.Td2a8ffmode Tff7b72= Te6edf3RNSTff7b72.Td2a8ffInterfacesTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffInterfaceTff7b72.Td2a8ffMODE_FULL

T8b949e# parse config
Te6edf3ifconf Tff7b72= Te6edf3InterfaceTff7b72.Td2a8ffget_config_objTb4b4b4(Te6edf3configurationTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffname Tff7b72= Te6edf3ifconfTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6ffnameTa5d6ff"Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fftarget_url Tff7b72= Te6edf3ifconfTff7b72.Td2a8ffgetTb4b4b4(Ta5d6ff"Ta5d6fftarget_urlTa5d6ff"Tb4b4b4, Tff7b72NoneTb4b4b4)

T8b949e# ensure target url is provided
Tff7b72if Tff7b72selfTff7b72.Td2a8fftarget_url Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3msg Tff7b72= Ta5d6fffTa5d6ff"Ta5d6fftarget_url is required for interface Ta5d6ff'Tffd700{Tff7b72selfTff7b72.Td2a8ffnameTffd700}Ta5d6ff'Ta5d6ff"
Tff7b72raise Tf85149SystemErrorTb4b4b4(Te6edf3msgTb4b4b4)

T8b949e# connect to websocket server if an existing connection was not provided
Tff7b72selfTff7b72.Td2a8ffwebsocket Tff7b72= Te6edf3websocket
Tff7b72if Tff7b72selfTff7b72.Td2a8ffwebsocket Tff7b72is Tff7b72NoneTb4b4b4:
Te6edf3thread Tff7b72= Te6edf3threadingTff7b72.Td2a8ffThreadTb4b4b4(Te6edf3targetTff7b72=Tff7b72selfTff7b72.Td2a8ffconnectTb4b4b4)
Te6edf3threadTff7b72.Td2a8ffdaemon Tff7b72= Tff7b72True
Te6edf3threadTff7b72.Td2a8ffstartTb4b4b4(Tb4b4b4)

T8b949e# called when a full packet has been received over the websocket
Tff7b72def Td2a8ffprocess_incomingTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4)Tb4b4b4:
T8b949e# do nothing if offline or detached
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffonline Tff7b72or Tff7b72selfTff7b72.Td2a8ffdetachedTb4b4b4:
Tff7b72return

T8b949e# update received bytes counter
Tff7b72selfTff7b72.Td2a8ffrxb Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)

T8b949e# update received bytes counter for parent interface
Tff7b72if Tff7b72selfTff7b72.Td2a8ffparent_interface Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffparent_interfaceTff7b72.Td2a8ffrxb Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)

T8b949e# send received data to transport instance
Tff7b72selfTff7b72.Td2a8ffownerTff7b72.Td2a8ffinboundTb4b4b4(Te6edf3dataTb4b4b4, Tff7b72selfTb4b4b4)

T8b949e# the running reticulum transport instance will call this method whenever the interface must transmit a packet
Tff7b72def Td2a8ffprocess_outgoingTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4)Tb4b4b4:
T8b949e# do nothing if offline or detached
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffonline Tff7b72or Tff7b72selfTff7b72.Td2a8ffdetachedTb4b4b4:
Tff7b72return

T8b949e# send to websocket server
Tff7b72tryTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffwebsocketTff7b72.Td2a8ffsendTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(
Ta5d6fffTa5d6ff"Ta5d6ffException occurred while transmitting via Tffd700{Tff7b72selfTffd700!s}Ta5d6ff"Tb4b4b4,
Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4,
Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffThe contained exception was: Tffd700{Te6edf3eTffd700!s}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Tff7b72return

T8b949e# update sent bytes counter
Tff7b72selfTff7b72.Td2a8fftxb Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)

T8b949e# update received bytes counter for parent interface
Tff7b72if Tff7b72selfTff7b72.Td2a8ffparent_interface Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffparent_interfaceTff7b72.Td2a8fftxb Tff7b72+Tff7b72= Tffa657lenTb4b4b4(Te6edf3dataTb4b4b4)

T8b949e# connect to the configured websocket server
Tff7b72def Td2a8ffconnectTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e# do nothing if interface is detached
Tff7b72if Tff7b72selfTff7b72.Td2a8ffdetachedTb4b4b4:
Tff7b72return

T8b949e# connect to websocket server
Tff7b72tryTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffConnecting to Websocket for Tffd700{Tff7b72selfTffd700!s}Ta5d6ff...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffwebsocket Tff7b72= Te6edf3connectTb4b4b4(
Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTff7b72.Td2a8fftarget_urlTffd700}Ta5d6ff"Tb4b4b4,
Te6edf3max_sizeTff7b72=Tff7b72NoneTb4b4b4,
Te6edf3compressionTff7b72=Tff7b72NoneTb4b4b4,
Tb4b4b4)
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffConnected to Websocket for Tffd700{Tff7b72selfTffd700!s}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffread_loopTb4b4b4(Tb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTffd700}Ta5d6ff failed with error: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

T8b949e# auto reconnect after delay
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffWebsocket disconnected for Tffd700{Tff7b72selfTffd700!s}Ta5d6ff...Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Te6edf3timeTff7b72.Td2a8ffsleepTb4b4b4(Tff7b72selfTff7b72.Td2a8ffRECONNECT_DELAY_SECONDSTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffconnectTb4b4b4(Tb4b4b4)

Tff7b72def Td2a8ffread_loopTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72True

Te6edf3websocket Tff7b72= Tff7b72selfTff7b72.Td2a8ffwebsocket
Tff7b72if Te6edf3websocket Tff7b72is Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72False
Tff7b72return

Tff7b72tryTb4b4b4:
Tff7b72for Te6edf3message Tff7b72in Te6edf3websocketTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffprocess_incomingTb4b4b4(Te6edf3messageTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTffd700}Ta5d6ff read loop error: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)

Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72False

Tff7b72def Td2a8ffdetachTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
T8b949e# mark as offline
Tff7b72selfTff7b72.Td2a8ffonline Tff7b72= Tff7b72False

T8b949e# close websocket
Tff7b72if Tff7b72selfTff7b72.Td2a8ffwebsocket Tff7b72is Tff7b72not Tff7b72NoneTb4b4b4:
Tff7b72selfTff7b72.Td2a8ffwebsocketTff7b72.Td2a8ffcloseTb4b4b4(Tb4b4b4)

T8b949e# mark as detached
Tff7b72selfTff7b72.Td2a8ffdetached Tff7b72= Tff7b72True


T8b949e# set interface class RNS should use when importing this external interface
Te6edf3interface_class Tff7b72= Te6edf3WebsocketClientInterface


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────